﻿#ifndef PROTOCOLEDITOR_H
#define PROTOCOLEDITOR_H

#include "probutility.h"
#include "findprotocoleditor.h"
#include "subdataprotocoleditor.h"
#include "sysprotocoleditor.h"
#include "syssubprotocoleditor.h"

//主界面

namespace Ui {
class ProtocolEditor;
}

class ProtocolEditor : public QMainWindow
{
    Q_OBJECT

public:
    explicit ProtocolEditor(QWidget *parent = nullptr);
    ~ProtocolEditor();

    void Initialization();
    void InittProtocolSysPanel(const QString sName);
    void InitProtocolSubSysPanel(const QString sName);
    void InitSubSysDataPanel(const QString sName);
    void InitToolBarEvent();

    static const  QString GetSysFilePath()
    {
        return QCoreApplication::applicationDirPath()+sSysFilePath;
    }
    static const QString GetSubFilePath()
    {
        return QCoreApplication::applicationDirPath()+sSubFilePath;
    }

    void DoSVNSomeThing(int nType);                                                                         //SVN操作
    void LoadSystemFile(const QString sFilePath,int nSelect = -1);                                          //加载系统协议
    void LoadSubSystemFile(const QString sFilePath,int nSysId,int nSelect = -1,int nType = 0);              //加载子协议
    void LoadSubSysData(const QDomNodeList list);                                                           //加载自协议数据

    QTableWidget* FindViewItemByName(const QString sName);
    QTextEdit *FindDataInfoViewByName(const QString sName);
    QDomElement FindSubElementNode(int nSysId);

    //创建删除信息提示警告面板
    VOID CreateDelMessageBox(const QString sTip, const PanelType eType);

protected:
    //过滤鼠标事件
    bool eventFilter(QObject *obj, QEvent *event);
private:
    int GetCurSelectSysItemId();
    int GetCurSelectSysSubItemId();

    QTableWidgetItem* GetCurSelectSysItem();
    QTableWidgetItem* GetCurSelectSysSubItem();
    QTableWidgetItem* GetCurSelectDatafoItem();

private slots:
    void sortSysTableByCol(int nCol);       //系统面板排序槽函数
    void sortSubTableByCol(int nCol);       //子系统面板排序槽函数
    void onCurrentLineHighLight();          //数据消息描述面板当前选中行高亮槽函数

    //面板点击更新面板信息槽函数
    void on_SysView_cellClicked(int row, int column);               //系统协议点击事件
    void on_MsgView_cellClicked(int row, int column);               //子协议点击事件
    void on_DataView_cellClicked(int row, int column);              //数据信息点击事件

    void on_SysView_cellPressed(int row, int column);
    void on_MsgView_cellPressed(int row, int column);
    void on_DataView_cellPressed(int row, int column);

    //查找数据槽函数
    void on_RecvFindRes(int nSysId,int nSubId,int nSubType);
    /*
    toobar  创建协议的时候需要检查当前id是否已经存在，存在则不可以创建
    双击编辑协议的时候检查id是否已经存在，如果存在则更新数据，如果不存在则新建协议
*/

    //面板双击编辑槽函数
    void on_SysView_itemDoubleClicked(QTableWidgetItem *item);
    void on_MsgView_itemDoubleClicked(QTableWidgetItem *item);
    void on_DataView_itemDoubleClicked(QTableWidgetItem *item);

    //系统协议编辑槽函数
    void on_CreateSysProtocolSlot(int nSysId,const QString sData);
    void on_EditorSysProtocolSlot(int nSysId,const QString sData,int nOldSysId);
    //子系统协议编辑槽函数
    void on_CreateSysSubProtocolSlot(int nSubId,const QString sData,int nType);
    void on_EditorSysSubProtocolSlot(int nSubId,const QString sData,int nType,int nOldSysId);
    //数据编辑槽函数
    void on_CreateSubDataProtocolSlot(int nType,const QString sData,const QString sDataInfo);
    void on_EditorSubDataProtocolSlot(int nType,const QString sData,const QString sDataInfo);

    //上下挑战数据的顺序
    void on_upBtn_clicked();
    void on_downBtn_clicked();

    void saveSubData();
    void resaveSubData(std::vector<MsgDataInfo>& datas);


private:
    FindProtocolEditor                          m_FindEditor;
    SysProtocolEditor                           m_SysEditor;
    SubDataProtocolEditor                       m_SubDataEditor;
    SysSubProtocolEditor                        m_SysSubEditor;

    DATAINFOOLDDATA                             m_DataOldData;
    QProcess*                                   m_process;

    Ui::ProtocolEditor *ui;
};

#endif // PROTOCOLEDITOR_H
